package chat;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ChatServlet extends HttpServlet {
	
    // 채팅 메시지를 저장하기 위한 문자열 배열이다. 
    String message[];
    // index 변수는 배여에서 메시지가 저장될 위치를 가리키고, size는 배열의 크기
     int index = 0, size = 10; 

    // 메시지 저장이 완료되면, doGet() 메소드를 호출해서 message 배열의 내용을 웹 브라우저에 전달
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
            // TODO Auto-generated method stub
           response.setContentType("text/html;charset=euc-kr");
           String first=request.getParameter("first");
           System.out.println("first : " + first ); 

           // 처음 방문하는 경우에 메시지를 message 배열에 저장한다. 
           if(first !=null){
        	   String id = request.getParameter("id");
               id = new String(id.getBytes("8859_1"),"euc-kr");

               synchronized (message) {
            	   message[index]= "<p align='center'>" + id + "님이 들어왔습니다." + "</p>";
            	   index = (index+1)%size;
               }
           } 

           PrintWriter out = response.getWriter();

          // 생성된 HTML 페이지가 캐시를 사용하지 않도록 meta 태그를 사용한다. 
          // 2초 간격으로 ChatServlet 서블릿을 방문하도록 한다. doGet() 사용한다.
           out.println("<html><head>");
           out.println("<meta http-equiv='pragma' content='no-cache'>");
           out.println("<meta http-equiv='cache-control' content='no-cache'>");
           out.println("<meta http-equiv='refresh' ");
           out.println("content='2; URL='ChatServlet'>");
           out.println("<title>채팅</title></head>");

           out.println("<body><center><h2>채팅</h2></center><hr>");

           int i = index;

        // 배열 내용을 출력한다. 
        // i 값이  index-1 이거나 index0 일때 i 값이 size-1이면, 원형 큐의 내용 중에서
        // 가장 최근 값을 제외하고는 모든 출력했다는 의미이다. 따라서 이조건을 만족하면 
        // while 문을 벗어난다.
           while(true){
               out.println(message[i]);
               out.println("<br>");

               i = ++i % size;

               if(i == index -1){
                     break;    
                                                                                                                                                                                                                                                                                                                                                                                                                }

	               if(index ==0 && i == size-1){
	                     break;
	               }
	           }
        	   out.println(message[i]);
        	   out.println("<br>");
        	   out.println("</body></html>");
           }   	

 // 사용자가 입력한 메시지를 message 배열에 저장한다. 
    public void doPost(HttpServletRequest request, HttpServletResponse response) 
           throws ServletException, IOException {
          // TODO Auto-generated method stub
           request.setCharacterEncoding("euc-kr");
           String id = request.getParameter("id");
          // 사용자가 입력한 메시지를 얻는다. 
           String msg = request.getParameter("msg");
           System.out.println("msg : " + msg);

         // 여러개의 서블릿 스레드가 실행되기 때문에 synchronized를 사용해서 message 멤버 필드를 
          // 락(lock)을 건다.
          // 메시지 내용을 message 배열에 저장하고 , index 값을 하나 증가시킨다. message 배열을 원형 큐
          // (Circular Queue)처럼 사용하기 위해서 배열의 끝까지 가면, 배열의 0번째로 이동한다.
           if(msg != null && msg.trim().length() !=0){
                    synchronized (message) {
                    message[index] = id + ":" + msg;
                    index = (index+1)%size;
         }

         doGet(request, response);
    }
}         

    public void init(){
    	message = new String[size];

    	for(int i=0; i<size; i++){
    		message[i]="";
    	}
    }  
}
